home *** CD-ROM | disk | FTP | other *** search
/ Computer Music Interactif…cial Edition 1999 Winter / cd 3.iso / mac / Mac / Shares / Midishare™1.68 / Development Tools / Libraries / MidiFiles / MidiFile.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-30  |  7.0 KB  |  203 lines  |  [TEXT/MPS ]

  1. /*
  2.  *    MIDIFILE.H
  3.  *    MIDI Files    version 1.00
  4.  *    constants and data structures
  5.  *
  6.   *    c GRAME 91-95 Dominique Fober
  7.  *  Please, report comments and bugs to msh@rd.grame.fr
  8.  */
  9.  
  10. #ifndef __MIDIFILE_H__
  11. #define __MIDIFILE_H__
  12.  
  13. #include <stdio.h>
  14.  
  15. #ifdef __Macintosh__
  16. #include <midishare.h>
  17. #define FAR
  18. #define NEAR
  19. #define MFAPI
  20. #endif
  21.  
  22. #ifdef __Windows__
  23. #include <mshare.h>
  24. #define MFAPI WINAPI __export
  25. #define nil 0
  26. #endif
  27.  
  28.  
  29. /*--------------------------------------------------------------------------*/
  30. extern int MidiFile_errno;        /* used similarly to errno                */
  31.                                 /* to read just in error case, if the    */
  32.                                 /* code is equal to MidiFileNoErr, look    */
  33.                                 /* at errno    */
  34.  
  35. #define isMidiFileError( fd) (MidiFile_errno!=MidiFileNoErr || ferror(fd->fd) || feof(fd->fd))
  36.  
  37. /*--------------------------------------------------------------------------*/
  38. /* implemented file types                                                     */
  39.  
  40. enum { midifile0= 0, midifile1, midifile2};
  41.  
  42.  
  43. /*--------------------------------------------------------------------------*/
  44. /* opening modes for existing files                                            */
  45. #define MidiFileRead    0            /* reading the file                */
  46. #define MidiFileAppend    1            /* appening to the file            */
  47.  
  48.  
  49. /*--------------------------------------------------------------------------*/
  50. /* time definition                                                            */
  51.  
  52. #define TicksPerQuarterNote    0
  53. #define Smpte24                24
  54. #define Smpte25                25
  55. #define Smpte29                29
  56. #define Smpte30                30
  57.  
  58.  
  59. /*--------------------------------------------------------------------------*/
  60. /* meta events types                                                         */
  61. #define    META            0xFF        /* meta event header code            */
  62.  
  63. #define MDF_NumSeq        0            /* sequence number                    */
  64. #define MDF_Texte        1            /* texte message                    */
  65. #define MDF_Copyright    2            /* copyright message                 */
  66. #define MDF_SeqName        3            /* sequence or track name            */
  67. #define MDF_InstrName    4            /* instrument name                    */
  68. #define MDF_Lyric        5            /* lyrics                            */
  69. #define MDF_Mark        6            /* marker                            */
  70. #define MDF_CuePt        7            /* cue point                        */
  71. #define MDF_ChanPref    0x20        /* MIDI Channel Prefix                */
  72. #define MDF_EndTrk        0x2F        /* end track                        */
  73. #define MDF_Tempo        0x51        /* tempo change                        */
  74. #define MDF_Offset        0x54        /* smpte offset                        */
  75. #define MDF_Meas        0x58        /* time signature                    */
  76. #define MDF_Ton            0x59        /* key signature                    */
  77. #define MDF_Extra        0x7F        /* sequencer specific meta event    */
  78.  
  79. /* length of the differents meta events */
  80. #define MDF_NumSeqLen    2
  81. #define MDF_ChanPrefLen 1
  82. #define MDF_EndTrkLen    0
  83. #define MDF_TempoLen    3
  84. #define MDF_OffsetLen    5
  85. #define MDF_MeasLen        4
  86. #define MDF_TonLen        2
  87.  
  88. /*--------------------------------------------------------------------------*/
  89. /* datas structures                                                            */
  90. /*--------------------------------------------------------------------------*/
  91.  
  92. typedef struct MDF_Header{            /* the file header structure    */
  93.     char     id[4];                    /* header id                    */
  94.     long    len;                    /* datas length ( = 6 )            */
  95.     short    format;                    /* file format                    */
  96.     unsigned short ntrks;            /* number of tracks                */
  97.     short    time;                    /* time representation            */
  98. }MDF_Header;
  99.  
  100.  
  101. typedef struct MDF_Trk{                /* track header structure        */
  102.     char id[4];                        /* header id                    */
  103.     unsigned long    len;            /* datas length                 */
  104. }MDF_Trk;
  105.  
  106. typedef struct midiFILE{            /* MIDI file descriptor        */
  107.     short     format;                    /* file format                    */
  108.     unsigned short ntrks;            /* number of tracks                    */
  109.     short    time;                    /* time representation            */
  110.                     /* for MIDI time: tick count per quarter note           */
  111.                     /* for smpte time: b. 15  = 1                           */
  112.                     /*                 b.8-14 = frame count per sec         */
  113.                     /*                   b.0-7  = tick count per frame        */
  114.     FILE     *fd;                    /* standard file descriptor             */    
  115.     fpos_t  trkHeadOffset;            /* track header offset                  */
  116.                                     /* nil if the track is closed           */
  117.     long    _cnt;                    /* count for end track detection        */
  118.     MidiSeqPtr keyOff;                /* keyOff coming from typeNote events   */
  119.     long     curDate;                /* current date                         */
  120.     Boolean mode;                    /* 0/1 : reading/writing                */
  121.     Boolean opened;                    /* flag for opened track                 */
  122. }midiFILE;
  123.  
  124. typedef midiFILE FAR * MIDIFilePtr;
  125.  
  126. typedef struct MDF_versions{
  127.     short    src;                    /* source code version                     */
  128.     short     MidiFile;                /* MIDI file format version                */
  129. }MDF_versions;
  130.  
  131.  
  132. /*--------------------------------------------------------------------------*/
  133. /* error codes                                                                 */
  134.  
  135. #define MidiFileNoErr        0        /* everything is ok                        */
  136. #define MidiFileErrFrmt        (-1)    /* internal datas format error            */
  137. #define MidiFileErrEvs        (-2)    /* MidiShare memory exhausted            */
  138. #define MidiFileErrNoTrack    (-3)    /* the track doesn't exists                */
  139. #define MidiFileErrAdd0        (-4)    /* try to add to a format 0    MIDI file     */
  140. #define MidiFileErrMode        (-5)    /* uncorrect file opening mode            */
  141. #define MidiFileErrUnknow    (-6)    /* unknown event type                    */
  142. #define MidiFileErrReset    (-7)    /* try to write a reset event            */
  143.  
  144. #define MidiFileErrTrackClose    (-8)    /* the track is closed                */
  145.  
  146. /*--------------------------------------------------------------------------*/
  147. /* some macros                                                            */
  148.  
  149. #ifdef __cplusplus
  150. inline Boolean isTrackOpen( midiFILE *fd) { return (fd)->opened; }
  151.  
  152. inline short smpte(MDF_Header *f)                    { return ((f)->time & 0x8000); }
  153. inline short frame_par_sec(MDF_Header *f)            { return (((f)->time & 0x8000) >> 8); }
  154. inline short ticks_par_frame(MDF_Header *f)            { return ((f)->time & 0xFF); }
  155. inline short ticks_par_quarterNote(MDF_Header *f)    { return (f)->time; }
  156. #else
  157. #define isTrackOpen(fd)    ((fd)->opened)
  158.  
  159. #define smpte(f)                    ((f)->time & 0x8000)
  160. #define frame_par_sec(f)            (((f)->time & 0x8000) >> 8)
  161. #define ticks_par_frame(f)            ((f)->time & 0xFF)
  162. #define ticks_par_quarterNote(f)    (f)->time
  163. #endif
  164.  
  165.  
  166. /*--------------------------------------------------------------------------*/
  167. /* functions declarations                                                    */
  168.  
  169. #ifdef __cplusplus
  170. extern "C" {
  171. #endif
  172.  
  173. const MDF_versions FAR * MFAPI MidiFileGetVersion(void);
  174.  
  175. /*-------------------------------- opening and closing the MIDI files ------*/
  176. MIDIFilePtr MFAPI MidiFileOpen  (const char FAR *filename, short mode);
  177. MIDIFilePtr MFAPI MidiFileCreate(const char FAR *filename, short format, short timeDef, short ticks);
  178. Boolean        MFAPI MidiFileClose (MIDIFilePtr fd);
  179.  
  180. /*-------------------------------- tracks management -----------------------*/
  181. Boolean    MFAPI MidiFileOpenTrack  ( MIDIFilePtr fd);
  182. Boolean    MFAPI MidiFileNewTrack   ( MIDIFilePtr fd);
  183. Boolean    MFAPI MidiFileCloseTrack ( MIDIFilePtr fd);
  184. Boolean    MFAPI MidiFileChooseTrack( MIDIFilePtr fd, short trackIndex);
  185.  
  186. /*-------------------------------- functions to read -----------------------*/
  187. MidiEvPtr  MFAPI MidiFileReadEv    ( MIDIFilePtr fd);
  188. MidiSeqPtr MFAPI MidiFileReadTrack ( MIDIFilePtr fd);
  189.  
  190. /*-------------------------------- functions to write ----------------------*/
  191. Boolean    MFAPI MidiFileWriteEv   ( MIDIFilePtr fd, MidiEvPtr ev);
  192. Boolean    MFAPI MidiFileWriteTrack( MIDIFilePtr fd, MidiSeqPtr seq);
  193.  
  194. /*-------------------------------- error codes access ----------------------*/
  195. int        MFAPI MidiFileGetMFErrno (void);
  196. int        MFAPI MidiFileGetErrno   (void);
  197.  
  198. #ifdef __cplusplus
  199. }
  200. #endif
  201.  
  202. #endif
  203.